package com.yt.system.service;

import com.yt.system.domain.GroupTable;
import com.yt.system.domain.JsonRootBean;
import com.yt.system.domain.User;
import com.yt.system.domain.UserRole;
import com.yt.system.vo.UserApplyResourceVO;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;
import java.util.Map;

/**
 * @author 高铭
 * @date 2019/9/19 - 11:17
 */
public interface UserService {
    /**
     * 查询所有用户信息
     *
     * @return
     */
    List<User> getAllUser();

    /**
     * 根据用户ID查询用户信息
     *
     * @param uid
     * @return
     */
    User selectByPrimaryKey(Integer uid);

    /**
     * 根据用户ID有选择的更改用户信息
     *
     * @param record
     * @return
     */
    int updateByPrimaryKeySelective(User record);

    /**
     * 查询所有用户
     *
     * @return
     */
    List<User> adminFindAllUser();

    /**
     * 管理员对全部人员随机分组
     *
     * @param groupTotalNum
     * @param eachGroupPeople
     * @param userList
     * @return
     */
    Map<String, Object> adminRandomToAllGroup(@Param("groupTotalNum") Integer groupTotalNum,
                                              @Param("eachGroupPeople") Integer eachGroupPeople, @Param("userList") List<User> userList);

    /**
     * 根据uemail查询用户（用户与uemail为一一对应关系）
     */
    User selectByEmail(String uemail);

    /**
     * 查找除自己之外的当前小组的其他人员信息
     *
     * @param uid
     * @param gid
     * @return
     */
    List<User> getGroupOtherUser(@Param("uid") Integer uid, @Param("gid") Integer gid);

    /**
     * 组长为组别添加口号和组别名称
     *
     * @param groupTable
     */
    void leaderInsertGroupMsg(GroupTable groupTable);

    /**
     * 返回这周的组别集合
     *
     * @return
     */
    List<Integer> getAllTheGid();

    /**
     * 返回组别和组别人员信息
     *
     * @param gidList
     * @return
     */
    Map<String, Object> getGroupAndPeopleMsg(List<Integer> gidList);

    /**
     * 选好并确认组长
     *
     * @param uid
     * @param gid
     */
    void sureGroupLeader(@Param("uid") Integer uid, @Param("gid") Integer gid);

    void deleteGroupLeader(Integer gid);

    GroupTable getGroupTable(Integer gid);

    List<User> getGroupTableList(Integer gid);

    void updateGroupMessageStatus();

    /**
     * 对某个组进行组别重置，将这个组别的状态修改成为历史
     *
     * @param gid
     */
    void resetTheGroup(Integer gid);

    /**
     * 修改这组人员的  组别--人员 状态,代表将这组人员的信息状态改变为过去
     *
     * @param gid
     */
    void resetTheGroupPeopleMsg(Integer gid);

    /**
     * 对某个人进行组别重置（将这个人从组别中移除出去）
     *
     * @param uid
     * @param gid
     * @return
     */
    int resetTheGroupOnePeople(@Param("uid") Integer uid, @Param("gid") Integer gid);

    /**
     * 将用户-角色表的数据全部删除，避免选出组长出现数据重复（与上周冲突）
     */
    void deleteUserRole();

    /**
     * 将user_role用户-角色表中的对应数据删除，避免了下周组长出现数据冲突
     *
     * @param gid
     */
    void deleteUserRoleByGid(Integer gid);

    void leaderUpdateGroupMsg(GroupTable groupTable);

    /**
     * 判断用户是否是组长
     *
     * @param uid
     * @param gid
     * @return
     */
    UserRole userIsLeader(Integer uid, Integer gid);

    /**
     * 判断这个组是否有组长
     *
     * @param gid
     * @return
     */
    UserRole groupIsHaveLeader(Integer gid);


    /**
     * 将重置的人员信息保存在临时表中
     *
     * @param uid
     */
    void saveUserToUserTemplate(Integer uid);

    /**
     * 将重置组别的所有人员信息添加到usertemplate
     *
     * @param gid
     */
    void saveAllPeopleToUserTemplate(Integer gid);

    /**
     * 查找重置分组之后处于没安排组别状态的所有人员
     *
     * @return
     */
    List<User> findAllNoInGroupPeople();

    /**
     * 将某个重置分组之后处于没安排组别状态的人员拉进具体的组别里
     *
     * @param uid
     * @param gid
     */
    void pullPeopleToGroup(@Param("uid") Integer uid, @Param("gid") Integer gid);

    /**
     * 有选择的插入用户信息
     * @param record
     * @return
     */
    int insertSelective(User record);


    /**
     * 管理员对所有人重置组别时候，删除用户临时表
     */
    void delUserTemplate();

    /**
     * 上传头像
     * @param uid
     * @return
     */
    int saveImg(Integer uid,String img);
    /**
     * 分组后将新的组信息插进group_account表中
     * @param groupTotalNum
     */
    void insertGroupAccount(Integer groupTotalNum);

}
